package com.deng.framework.beans.factory.config;

import com.deng.framework.beans.BeansException;
import com.deng.framework.beans.PropertyValues;

/**
 * bean生命周期中一个很关键的扩展的接口类，继承了BeanPostProcessor
 * 该类定义了了postProcessPropertyValues函数，用于在Bean 对象实例化完成后，设置属性操作之前执行
 *
 * AOP：将AOP集成到Spring的最核心的接口，继承了BeanPostProcessor
 * 这表明AOP是一个扩展组件，且其生命周期和BeanPostProcessor是一样的，
 *
 * 注解扩展：在将注解引入spring的时候也用到了这个类，因为需要这个类的函数来将注解中的属性填充插入到bean生命周期中
 */
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    //这里和BeanPostProcessor中的函数名字一样，但参数不同，是专门用来处理被AOP代理的类
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

    //在 Bean 对象实例化完成后，设置属性操作之前执行此方法，用于注解处理中的属性填充部分
    PropertyValues postProcessPropertyValues(PropertyValues pvs, Object bean, String beanName) throws BeansException;

    //在Bean通过构造函数或工厂方法被实例化后，在注入属性之前执行操作
    boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

    //AOP中对于三级缓存的适应
    default Object getEarlyBeanReference(Object bean, String beanName) {
        return bean;
    }
}
